#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setFixedSize(1024, 600);

    //1、实例化服务器类的对象
    tcpServer = new QTcpServer;

    //绑定和监听
    //2、绑定和监听
//    QString ip = ui->lineEdit_ip->text();
//    QString port = ui->lineEdit_port->text();
    QString ip = "192.168.2.46";
    QString port = "60000";
    tcpServer->listen(QHostAddress(ip), port.toUInt());
    //ui->btn_listen->setEnabled(false);

    //3、当有新的客户端连接上来的时候,服务器类的对象tcpServer会 自动发射newConnection信号，关联槽函数
    connect(tcpServer,&QTcpServer::newConnection,this,&MainWindow::onRecvNewClientSlot);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onRecvNewClientSlot()
{
    //int clientFd = accpet() 接受客户端的连接 返回 新的客户端连接上来的文件描述符
    //获取新客户端的对象指针   //int clientFd = accpet()
    QTcpSocket *clientSocket =  tcpServer->nextPendingConnection();
    //将每次连接上来的客户端对象指针存储到容器中
    clientList.push_back(clientSocket);

    //当有新的客户端连接上来的 时候，将客户端的IP 和端口号 显示到 好友列表上
    QString newClientIp = clientSocket->peerAddress().toString();
    QString newClientPort = QString::number(clientSocket->peerPort());
    ui->text_ip->append("[" + newClientIp+"], [" + newClientPort + "]");
//    ui->listWidget->addItem(newClientIp+"  " + newClientPort);

    //4、当有数据发送过来的时候，clientSocket 对象会自动发射 readyRead信号，关联槽函数，在槽函数中获取对方发来的数据
    connect(clientSocket, &QTcpSocket::readyRead, this, &MainWindow::onRecvDataSlot);
}

//所有连接上来的客户端 给服务器发送数据时，都会执行该槽函数
void MainWindow::onRecvDataSlot()
{
    //获取信号的发送者 ，也就是先确定到底是哪个客户端 发送数据
    QTcpSocket *client =  (QTcpSocket*)this->sender();
    QString data = client->readAll();

    //将data根据":"拆分
    QStringList list = data.split(':');
    //注册
    if(list[list.size() - 1].compare("account_ok") == 0)
    {
        for(int i = 0; i < list.size() - 1; i ++)
        {
            for(auto it = usrInfo.begin(); it != usrInfo.end(); it ++)
            {
                if(it.key().compare(list[0]) == 0)
                {
                    client->write("error01");
                    return;
                }
            }
        }

        //将用户信息list[0]表示账号，list[1]表示密码，尾差进usrInfo容器中
        usrInfo.insert(usrInfo.end(), list[0], list[1]);
        client->write("success01");

        //调试信息
        int i = 0;
        //qDebug() << "当前存储的所有账号和密码：";

        //每次有新的账号注册将之前的信息清空再遍历打印
        ui->text_usrinfo->setText("");
        for(auto it = usrInfo.begin(); it != usrInfo.end(); it ++)
        {
            QString str = QString("序号:[%1],账号:%2,密码:%3").arg(++ i).arg(it.key()).arg(it.value());
            if(it == usrInfo.begin())
            {
                ui->text_usrinfo->setText(str);
                continue;
            }
            ui->text_usrinfo->append(str);
        }
    }
    //登录
    else if(list[list.size() - 1].compare("login_ok") == 0)
    {
        for(auto it = usrInfo.begin(); it != usrInfo.end(); it ++)
        {
            if(it.key().compare(list[0]) == 0 && it.value().compare(list[1]) == 0)
            {
                client->write("success02");
                return;
            }
        }
        client->write("error02");
    }
    //主页确认进入菜单
    else if(list[list.size() - 1].compare("homepage_ok") == 0)
    {
        ui->text_need->append(list[0] + "号桌, " + list[1] + "位顾客已入座!");
    }
    //呼叫服务员
    else if(list[list.size() - 1].compare("call") == 0)
    {
        ui->text_service->append(list[0] + "号桌顾客需要" + list[1]);
    }
    //提交订单
    else if(list[list.size() - 1].compare("dishes") == 0)
    {
        //先清空
        ui->text_service->setText("");

        ui->text_service->append(list[1] + " 号桌");

        info = list[1] + ":" + list[0];
        qDebug() << info;

        QStringList newList = list[0].split(";");
        QString str = newList[0];
        newList[0] = QString(" %1").arg(str);

        for(int i = 0; i < newList.size() - 1; i ++)
        {
            ui->text_service->append(newList[i]);
        }
        ui->text_service->append(newList[newList.size() - 1]);
    }
    //支付
    else if(list[list.size() - 1].compare("pay") == 0)
    {
        ui->text_service->append(list[0]);
    }
}

void MainWindow::on_btn_clean_clicked()
{
    ui->text_ip->setText("");
    ui->text_usrinfo->setText("");
    ui->text_service->setText("");
    ui->text_need->setText("");
}

void MainWindow::on_btn_clicked()
{
    //第一步：创建另一个界面的对象  new MainWindow(this) 把父窗口传递过去，记录从哪一个界面跳转
    MainWindowMenu *mainWidget = new MainWindowMenu(this);
    mainWidget->setAttribute(Qt::WA_DeleteOnClose);//关闭之后自动销毁对象

    mainWidget->sendInfo(info);
    //第二步：显示要跳转的界面
    mainWidget->show();

    //第三步：隐藏当前的界面,跳转到另一个界面之后，点击返回按钮还可以返回当前界面
    this->hide();
}
